# This Python file uses the following encoding: utf-8

#from django.contrib.auth.models import User
from missatgeria.models import Missatge
from presencia.models import Impartir, EstatControlAssistencia, ControlAssistencia
from tutoria.models import Tutor

from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
import datetime as dt
from usuaris.models import User2Professor, User2Professional
from incidencies.models import Incidencia
from incidencies.rules import Incidencia_despres_de_posar


#-------------------------------------------------------------------------------------
def connecta():
    
    from django.db.models.signals import post_save, pre_save, pre_delete
    
    #Impartir
    pre_delete.connect(Impartir_pre_delete, sender= Impartir)
    pre_save.connect(Impartir_pre_save, sender = Impartir )
    post_save.connect(Impartir_post_save, sender = Impartir )
    
    #ControlAssistencia
    pre_delete.connect(ControlAssistencia_pre_delete, sender= ControlAssistencia)
    pre_save.connect(ControlAssistencia_pre_save, sender = ControlAssistencia )
    post_save.connect(ControlAssistencia_post_save, sender = ControlAssistencia )
    
    #expulsio del centre
    pre_delete.connect(EstatControlAssistencia_pre_delete, sender= EstatControlAssistencia)
    pre_save.connect(EstatControlAssistencia_pre_save, sender = EstatControlAssistencia )
    post_save.connect(EstatControlAssistencia_post_save, sender = EstatControlAssistencia )
    
#-------------Impartir-------------------------------------------------------------      

def Impartir_clean( instance ):
    pass

def Impartir_pre_delete( sender, instance, **kwargs):
    pass
    
def Impartir_pre_save(sender, instance,  **kwargs):
    instance.clean()

def Impartir_post_save(sender, instance, created, **kwargs):
    #bussiness rule:
    #si un professor passa llista, també passa llista de 
    #totes les imparticions que no tinguin alumnes.
    if instance.professor_passa_llista is not None:
        altresHores = Impartir.objects.filter( horari__hora = instance.horari.hora, 
                                               dia_impartir = instance.dia_impartir,
                                               controlassistencia__isnull = True,
                                               horari__professor = instance.horari.professor,
                                               horari__grup__isnull = False  )
        
        altresHores.update( professor_passa_llista = instance.professor_passa_llista,
                           dia_passa_llista = instance.dia_passa_llista )
    
    pass

def Impartir_despres_de_passar_llista(instance):
    #Si passa llista un professor que no és el de l'Horari cal avisar.
    if instance.professor_passa_llista <> instance.horari.professor:
        remitent = instance.professor_passa_llista
        text_missatge = u"""Has passat llista a un grup que no és el teu: ({0}). 
                         El professor del grup {1} rebrà un missatge com aquest.
                         """.format( unicode(instance),  unicode(instance.horari.professor) )
        msg = Missatge( remitent = remitent.getUser(), text_missatge = text_missatge )           
        msg.envia_a_usuari( usuari = instance.professor_passa_llista.getUser(), importancia = 'VI')

        text_missatge = u"""Ha passat llista d'una classe on consta que la fas tú: ({0}). 
                         """.format( unicode(instance),  unicode(instance.horari.professor) )
        msg = Missatge( remitent = remitent.getUser(), text_missatge = text_missatge )           
        msg.envia_a_usuari( usuari = instance.horari.professor.getUser(), importancia = 'VI')
    

#-------------ControlAssistencia-------------------------------------------------------------      

def ControlAssistencia_clean( instance ):
    ( user, l4)  = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
    
    if l4: return    
    
    isUpdate = instance.pk is not None    
    instance.instanceDB = None if not isUpdate else instance.__class__.objects.get( pk = instance.pk )
    
    errors = {}
    
    tutors = [ tutor for tutor in instance.alumne.tutorsDeLAlumne() ]
    if user: instance.professor = User2Professor( user )

    #
    # Només es poden modificar assistències 
    #
    nMaxDies = 30*3
    if isUpdate and instance.impartir.dia_impartir < ( dt.date.today() - dt.timedelta( days = nMaxDies) ):
        errors.setdefault(NON_FIELD_ERRORS, []).append( u'''Aquest controll d'assistència és massa antic per ser modificat (Té més de {0} dies)'''.format(nMaxDies) )
        
    #todo: altres controls:
    daqui_2_hores = dt.datetime.now() + dt.timedelta( hours = 2)
    if isUpdate and instance.impartir.diaHora() > daqui_2_hores :
        errors.setdefault(NON_FIELD_ERRORS, []).append( u'''Encara no es pot entrar aquesta assistència 
                                    (Falta {0} per poder-ho fer )'''.format(
                                       instance.impartir.diaHora()  - daqui_2_hores ) )

    #Una falta justificada pel tutor no pot ser matxacada per un professor
    socTutor = hasattr(instance, 'professor') and instance.professor and instance.professor in tutors    
    justificadaDB = instance.instanceDB and instance.instanceDB.estat and instance.instanceDB.estat.codi_estat.upper() == 'J'
    justificadaAra = instance.estat and instance.estat.codi_estat.upper() == 'J'
    posat_pel_tutor = instance.instanceDB and instance.instanceDB.professor and instance.instanceDB.professor in tutors
    
    if not socTutor and justificadaDB and posat_pel_tutor and not justificadaAra:
        errors.setdefault(NON_FIELD_ERRORS, []).append( u'''
                                  La falta d'en {0} no es pot modificar. El tutor Sr(a) {1} ha justificat la falta.  
                                                            '''.format(
                                       instance.alumne, instance.instanceDB.professor ) )
        
    #Només el tutor, el professor de guardia o el professor titular pot modificar un control d'assistència:
    if user:
        professors_habilitats = tutors
        if instance.professor: professors_habilitats.append( instance.professor.pk )
        if instance.impartir.horari.professor: professors_habilitats.append( instance.impartir.horari.professor.pk )
        if instance.impartir.professor_guardia: professors_habilitats.append( instance.impartir.professor_guardia.pk )
        if user.pk not in professors_habilitats:
            errors.setdefault(NON_FIELD_ERRORS, []).append( u'''Només el professor de l'assignatura, 
                                            el professor de guardia que ha passat llista o el tutor poden variar una assistència. 
                                                            ''' )         
    
    if len( errors ) > 0:
        raise ValidationError(errors)

    #Justificada: si el tutor l'havia justificat deixo al tutor com el que ha desat la falta:
    if justificadaDB and posat_pel_tutor:
        instance.professor = instance.instanceDB.professor
    

def ControlAssistencia_pre_delete( sender, instance, **kwargs):
    pass
    
def ControlAssistencia_pre_save(sender, instance,  **kwargs):
    instance.clean()

def ControlAssistencia_post_save(sender, instance, created, **kwargs):
    frase = u'Ha arribat tard a classe.'
    print 'post save'
    if instance.estat and instance.estat.codi_estat == 'R':
        ja_hi_es = Incidencia.objects.filter( 
                                                          alumne = instance.alumne,
                                                          control_assistencia = instance,
                                                          descripcio_incidencia = frase,
                                                          es_informativa = False ,).exists()

        if not ja_hi_es:
            try:
                i = Incidencia.objects.create(    
                                          professional = User2Professional( instance.professor ),
                                          alumne = instance.alumne,
                                          control_assistencia = instance,
                                          descripcio_incidencia = frase,
                                          es_informativa = False ,)
                Incidencia_despres_de_posar( i )
            except:
                pass
            
    else:
        try:
            Incidencia.objects.filter( 
                                                          alumne = instance.alumne,
                                                          control_assistencia = instance,
                                                          descripcio_incidencia = frase,
                                                          es_informativa = False ,).delete()
        except:
            pass
            
 

#-------------EstatControlAssistencia-------------------------------------------------------------      

def EstatControlAssistencia_clean( instance ):
    pass

def EstatControlAssistencia_pre_delete( sender, instance, **kwargs):
    pass
    
def EstatControlAssistencia_pre_save(sender, instance,  **kwargs):
    instance.clean()

def EstatControlAssistencia_post_save(sender, instance, created, **kwargs):
    pass

